home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / plan / src / msgmenu.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  7KB  |  232 lines

  1. /*
  2.  * Create and destroy a text popup. It is installed when the Message icon
  3.  * (looks like a post-it note), the Script icon (a percent sign), or the
  4.  * Meeting icon (four arrows) is pressed. The popup shows the appropriate
  5.  * title, and string entered or removed by the user are stored back into
  6.  * the proper string pointers (which point to members of the edit struct).
  7.  *
  8.  *    destroy_text_popup()
  9.  *    create_text_popup(title, initial, x)
  10.  */
  11.  
  12. #ifndef MIPS
  13. #include <stdlib.h>
  14. #endif
  15. #include <stdio.h>
  16. #include <time.h>
  17. #include <Xm/Xm.h>
  18. #include <Xm/DialogS.h>
  19. #include <Xm/Form.h>
  20. #include <Xm/LabelP.h>
  21. #include <Xm/LabelG.h>
  22. #include <Xm/PushBP.h>
  23. #include <Xm/PushBG.h>
  24. #include <Xm/ScrolledW.h>
  25. #include <Xm/Text.h>
  26. #include <Xm/Protocols.h>
  27. #include "cal.h"
  28.  
  29. static void        done_callback(), delete_callback(), clear_callback();
  30. extern char        *mkbuttonstring();
  31. extern char        *mystrdup();
  32. extern void        help_callback();
  33.  
  34. extern Display        *display;    /* everybody uses the same server */
  35. extern struct edit    edit;        /* info about entry being edited */
  36. extern struct list    *mainlist;    /* list of all schedule entries */
  37.  
  38. static BOOL        have_shell;    /* message popup exists if TRUE */
  39. static char        **source;    /* ptr to string ptr in edit.entry */
  40. static char        button_x;    /* which button was pressed, SC_* */
  41. static Widget        shell;        /* popup menu shell */
  42. static Widget        text;        /* text widget */
  43.  
  44.  
  45. /*
  46.  * destroy a popup. Remove it from the screen, and destroy its widgets.
  47.  * It's too much trouble to keep them for next time.
  48.  */
  49.  
  50. destroy_text_popup()
  51. {
  52.     char            *string;    /* contents of text widget */
  53.  
  54.     if (have_shell && edit.editing) {
  55.         if (*source)
  56.             free(*source);
  57.         string = XmTextGetString(text);
  58.         *source = *string ? mystrdup(string) : 0;
  59.         edit.changed = TRUE;
  60.         edit.entry.suspended = FALSE;
  61.         print_pixmap(edit.menu->entry[edit.y][button_x],
  62.             *string ? button_x + PIC_MESSAGE - SC_MESSAGE : -1);
  63.         print_button(edit.menu->entry[edit.y][SC_NOTE],
  64.             mkbuttonstring(edit.menu, SC_NOTE, edit.y));
  65.         XtFree(string);
  66.     }
  67.     if (have_shell) {
  68.         XtPopdown(shell);
  69.         XTDESTROYWIDGET(shell);
  70.         have_shell = FALSE;
  71.         confirm_new_entry();
  72.     }
  73. }
  74.  
  75.  
  76. /*
  77.  * create a message or script popup as a separate application shell.
  78.  */
  79.  
  80. create_text_popup(title, initial, x)
  81.     char            *title;        /* menu title string */
  82.     char            **initial;    /* initial default text */
  83.     int            x;        /* button pressed, SC_* */
  84. {
  85.     Widget            form, but, help;
  86.     Arg            args[20];
  87.     int            n;
  88.     Atom            closewindow;
  89.  
  90.     destroy_text_popup();
  91.  
  92.     n = 0;
  93.     XtSetArg(args[n], XmNdeleteResponse,    XmDO_NOTHING);        n++;
  94.     XtSetArg(args[n], XmNiconic,        False);            n++;
  95.     shell = XtAppCreateShell(title, "plan",
  96.             applicationShellWidgetClass, display, args, n);
  97. #    ifdef EDITRES
  98.     XtAddEventHandler(shell, (EventMask)0, TRUE, 
  99.              _XEditResCheckMessages, NULL);
  100. #    endif
  101.     set_icon(shell, 1);
  102.     form = XtCreateManagedWidget("msgform", xmFormWidgetClass,
  103.             shell, NULL, 0);
  104.     XtAddCallback(form, XmNhelpCallback, help_callback, (XtPointer)"msg");
  105.  
  106.                             /*-- buttons --*/
  107.     n = 0;
  108.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  109.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  110.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  111.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  112.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  113.     XtSetArg(args[n], XmNwidth,        80);            n++;
  114.     XtSetArg(args[n], XmNtraversalOn,    False);            n++;
  115.     but = XtCreateManagedWidget("Delete", xmPushButtonWidgetClass,
  116.             form, args, n);
  117.     XtAddCallback(but, XmNactivateCallback, delete_callback, (XtPointer)0);
  118.     XtAddCallback(but, XmNhelpCallback,     help_callback,
  119.                         (XtPointer)"msg_delete");
  120.  
  121.     n = 0;
  122.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  123.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  124.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  125.     XtSetArg(args[n], XmNleftWidget,    but);            n++;
  126.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  127.     XtSetArg(args[n], XmNwidth,        80);            n++;
  128.     XtSetArg(args[n], XmNtraversalOn,    False);            n++;
  129.     but = XtCreateManagedWidget("Clear", xmPushButtonWidgetClass,
  130.             form, args, n);
  131.     XtAddCallback(but, XmNactivateCallback, clear_callback, (XtPointer)0);
  132.     XtAddCallback(but, XmNhelpCallback,     help_callback,
  133.                         (XtPointer)"msg_clear");
  134.  
  135.     n = 0;
  136.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  137.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  138.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  139.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  140.     XtSetArg(args[n], XmNwidth,        80);            n++;
  141.     but = XtCreateManagedWidget("Done", xmPushButtonWidgetClass,
  142.             form, args, n);
  143.     XtAddCallback(but, XmNactivateCallback, done_callback, (XtPointer)0);
  144.     XtAddCallback(but, XmNhelpCallback,     help_callback,
  145.                             (XtPointer)"msg_done");
  146.  
  147.     n = 0;
  148.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  149.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  150.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  151.     XtSetArg(args[n], XmNrightWidget,    but);            n++;
  152.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  153.     XtSetArg(args[n], XmNwidth,        80);            n++;
  154.     help = XtCreateManagedWidget("Help", xmPushButtonWidgetClass,
  155.             form, args, n);
  156.     XtAddCallback(help, XmNactivateCallback,
  157.                     help_callback, (XtPointer)"msg");
  158.     XtAddCallback(help, XmNhelpCallback,
  159.                     help_callback, (XtPointer)"msg");
  160.  
  161.                             /*-- text --*/
  162.     n = 0;
  163.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  164.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  165.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_WIDGET);    n++;
  166.     XtSetArg(args[n], XmNbottomWidget,    but);            n++;
  167.     XtSetArg(args[n], XmNbottomOffset,    16);            n++;
  168.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  169.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  170.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  171.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  172.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  173.     XtSetArg(args[n], XmNeditMode,        XmMULTI_LINE_EDIT);    n++;
  174.     XtSetArg(args[n], XmNcolumns,        40);            n++;
  175.     XtSetArg(args[n], XmNrows,        10);            n++;
  176.     XtSetArg(args[n], XmNscrollVertical,    True);            n++;
  177.     XtSetArg(args[n], XmNpendingDelete,    False);            n++;
  178.     text = XmCreateScrolledText(form, "text", args, n);
  179.     if (*initial) {
  180.         XmTextSetString(text, *initial);
  181.         XmTextSetInsertionPosition(text, strlen(*initial));
  182.     }
  183.     XtManageChild(text);
  184.     XtAddCallback(text, XmNhelpCallback, help_callback,
  185.                             (XtPointer)"msg_text");
  186.  
  187.     XtPopup(shell, XtGrabNone);
  188.     closewindow = XmInternAtom(display, "WM_DELETE_WINDOW", False);
  189.     XmAddWMProtocolCallback(shell, closewindow,
  190.                     done_callback, (XtPointer)shell);
  191.     have_shell = TRUE;
  192.     source     = initial;
  193.     button_x   = x;
  194. }
  195.  
  196.  
  197. /*-------------------------------------------------- callbacks --------------*/
  198. /*
  199.  * All of these routines are direct X callbacks.
  200.  */
  201.  
  202. /*ARGSUSED*/
  203. static void done_callback(widget, item, data)
  204.     Widget                widget;
  205.     int                item;
  206.     XmToggleButtonCallbackStruct    *data;
  207. {
  208.     destroy_text_popup();
  209. }
  210.  
  211.  
  212. /*ARGSUSED*/
  213. static void delete_callback(widget, item, data)
  214.     Widget                widget;
  215.     int                item;
  216.     XmToggleButtonCallbackStruct    *data;
  217. {
  218.     XmTextSetString(text, "");
  219.     destroy_text_popup();
  220. }
  221.  
  222.  
  223. /*ARGSUSED*/
  224. static void clear_callback(widget, item, data)
  225.     Widget                widget;
  226.     int                item;
  227.     XmToggleButtonCallbackStruct    *data;
  228. {
  229.     XmTextSetString(text, "");
  230.     XmTextSetInsertionPosition(text, 0);
  231. }
  232.